package com.yufei.utils;


import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;


/**
 * 域名获取工具
 * 
 * @author yeyonghuan
 * 
 */
public class DomainUtil {

	private static final String PROTOCOL = "://";
	
	private static final String SLASH = "/";
	
	private static final String PORT = ":";
	
	private static final String DOT = "\\.";
	
	private static final String DOT2 = ".";
	
	//ip地址验证
	public static final Pattern IPPattern = Pattern.compile("[\\d]{1,3}\\.[\\d]{1,3}\\.[\\d]{1,3}\\.[\\d]{1,3}");
		
	public static class DomainPostfixs {
		
		//通用顶级域名
		public static final Pattern POSTFIXS = Pattern
				.compile("^(com)+|(org)+|(net)+|(edu)+|(mil)+|(int)+|(pro)+|(idv)+" +
						"|(biz)+|(museum)+|(coop)+|(aero)+|(info)+|(name)+|(cc)+|(tv)+|(gov)+" +
						"|(travel)+|(asia)+|(jobs)+|(mobi)+|(tel)+|(cat)+$");
		
		//国家地理域名
		public static final Pattern LOCATION_POSTFIXS = Pattern.compile("^(ac)+|(ad)+|(ae)+|(af)+|(ag)+|(ai)+|(al)+|(am)+|(an)+|(ao)+|(aq)+|(ar)+|(as)+|(at)+|(au)"
				+"+|(aw)+|(ax)+|(az)+|(ba)+|(bb)+|(bd)+|(be)+|(bf)+|(bg)+|(bh)+|(bi)+|(bj)+|(bm)+|(bn)+|(bo)"
				+"+|(br)+|(bs)+|(bt)+|(bv)+|(bw)+|(by)+|(bz)+|(ca)+|(cc)+|(cd)+|(cf)+|(cg)+|(ch)+|(ci)+|(ck)"
				+"+|(cl)+|(cm)+|(cn)+|(co)+|(cr)+|(cu)+|(cv)+|(cx)+|(cy)+|(cz)+|(de)+|(dj)+|(dk)+|(dm)+|(do)"
				+"+|(dz)+|(ec)+|(ee)+|(eg)+|(eh)+|(er)+|(es)+|(et)+|(eu)+|(fi)+|(fj)+|(fk)+|(fm)+|(fo)+|(fr)+|(ga)"
				+"+|(gb)+|(gd)+|(ge)+|(gf)+|(gg)+|(gh)+|(gi)+|(gl)+|(gm)+|(gn)+|(gp)+|(gq)+|(gr)+|(gs)+|(gt)"
				+"+|(gu)+|(gw)+|(gy)+|(hk)+|(hm)+|(hn)+|(hr)+|(ht)+|(hu)+|(id)+|(ie)+|(il)+|(im)+|(in)+|(io)"
				+"+|(iq)+|(ir)+|(is)+|(it)+|(je)+|(jm)+|(jo)+|(jp)+|(ke)+|(kg)+|(kh)+|(ki)+|(km)+|(kn)+|(kp)"
				+"+|(kr)+|(kw)+|(ky)+|(kz)+|(la)+|(lb)+|(lc)+|(li)+|(lk)+|(lr)+|(ls)+|(lt)+|(lu)+|(lv)+|(ly)"
				+"+|(ma)+|(mc)+|(md)+|(me)+|(mg)+|(mh)+|(mk)+|(ml)+|(mm)+|(mn)+|(mo)+|(mp)+|(mq)+|(mr)+|(ms)"
				+"+|(mt)+|(mu)+|(mv)+|(mw)+|(mx)+|(my)+|(mz)+|(na)+|(nc)+|(ne)+|(nf)+|(ng)+|(ni)+|(nl)+|(no)"
				+"+|(np)+|(nr)+|(nu)+|(nz)+|(om)+|(pa)+|(pe)+|(pf)+|(pg)+|(ph)+|(pk)+|(pl)+|(pm)+|(pn)+|(pr)"
				+"+|(ps)+|(pt)+|(pw)+|(py)+|(qa)+|(re)+|(ro)+|(rs)+|(ru)+|(rw)+|(sa)+|(sb)+|(sc)+|(sd)+|(se)"
				+"+|(sg)+|(sh)+|(si)+|(sj)+|(sk)+|(sl)+|(sm)+|(sn)+|(so)+|(sr)+|(st)+|(su)+|(sv)+|(sy)+|(sz)"
				+"+|(tc)+|(td)+|(tf)+|(tg)+|(th)+|(tj)+|(tk)+|(tl)+|(tm)+|(tn)+|(to)+|(tp)+|(tr)+|(tt)+|(tv)"
				+"+|(tw)+|(tz)+|(ua)+|(ug)+|(uk)+|(um)+|(us)+|(uy)+|(uz)+|(va)+|(vc)+|(ve)+|(vg)+|(vi)+|(vn)"
				+"+|(vu)+|(wf)+|(ws)+|(ye)+|(yt)+|(yu)+|(za)+|(zm)+|(zw)+$");
		
	
		/**
		 * 检测该域名是否属于通用顶级域名列表
		 * @param domainSegment
		 * @return
		 */
		public static boolean findPostfixs(String domainSegment) {
			
			return POSTFIXS.matcher(domainSegment).matches();
		}
		
		
		/**
		 * 检测该域名是否属于国家地理域名
		 * @param domainSegment
		 * @return
		 */
		public static boolean isLocaionPostfixs(String domainSegment) {
             return LOCATION_POSTFIXS.matcher(domainSegment).matches();
		}
	}

	/**
	 * 去掉url中的协议，端口号，子链
	 * 
	 * @param url
	 * @return
	 * @throws java.net.URISyntaxException
	 */
	public static String removeUrlProtocol(String url) {
		//把所有传过来的链接转换为小写
		StringBuilder sb = new StringBuilder(url.toLowerCase());
		//去掉协议
		   if(sb.indexOf(PROTOCOL) >= 0)
		    {
		    	sb.delete(0, sb.indexOf(PROTOCOL) + PROTOCOL.length());
		    }
//		   //去掉端口
//		   if(sb.indexOf(PORT) >= 0)
//		   {
//			   sb.delete(sb.indexOf(PORT), sb.length());
//		   }
		   //去掉子链接
		   if(sb.indexOf(SLASH) >=0)
		   {
			   sb.delete(sb.indexOf(SLASH), sb.length()); 
		   }
		   return sb.toString();
	}
	
	/**
	 * 去掉url中的协议，端口号，子链
	 * 子域名获取
	 * @param url
	 * @return
	 * @throws java.net.URISyntaxException
	 */
	public static String removeUrlProtocolAndPort(String url) {
		//把所有传过来的链接转换为小写
		StringBuilder sb = new StringBuilder(url.toLowerCase());
		//去掉协议
		   if(sb.indexOf(PROTOCOL) >= 0)
		    {
		    	sb.delete(0, sb.indexOf(PROTOCOL) + PROTOCOL.length());
		    }
//		   //去掉端口
		   if(sb.indexOf(PORT) >= 0)
		   {
			   sb.delete(sb.indexOf(PORT), sb.length());
		   }
		   //去掉子链接
		   if(sb.indexOf(SLASH) >=0)
		   {
			   sb.delete(sb.indexOf(SLASH), sb.length()); 
		   }
		   return sb.toString();
	}
	
	public static String getSite(String url)
	{
		if (StringUtils.isNotEmpty(url))
		{
			return removeUrlProtocolAndPort(url);
		} else
		{
			return null;
		}
	}
	
	/**
	 * 顶级域名获取
	 * @param url
	 * @return
	 */
	public static String getTopDomain(String url) {
		if(StringUtils.isNotEmpty(url.trim()))
		{
			return null;
		}
		//移除协议头，端口，等只取出网站地址,划分.为数组
		String tmp1 = removeUrlProtocolAndPort(url);
		if(isIp(tmp1))
		{
			//如果是ip地址并且没有端口号
			String tmp2 = removeUrlProtocol(url);
			if(tmp1.equals(tmp2))
			{
				return tmp1;
			}
			else 
			{
				//如果是ip地址并且有端口号，则返回ip：端口
				return tmp2;
			}
		}
		
		String domain_tmp = tmp1;
		removeUrlProtocolAndPort(url);
		if(isIp(domain_tmp))
		{
			return domain_tmp;
		}
		String[] domain_segments = domain_tmp.split(DOT);
		String domainReturn = null;

		if (domain_segments.length <= 1) {
			return null;
		} 
		int lastIndex = domain_segments.length - 1;

		if(domain_segments.length >= 2)
		{
		//通用顶级域名结尾的域名 .com
		if (DomainPostfixs.findPostfixs(domain_segments[lastIndex])) {
			
			domainReturn = domain_segments[lastIndex-1] + DOT2 + domain_segments[lastIndex];
			return domainReturn;
		}
		//国家地理域名结尾的处理 .cn
		if (DomainPostfixs.isLocaionPostfixs(domain_segments[lastIndex])) {
			//如果下一级域名属于通用顶级域名 sina.com.cn
			if (DomainPostfixs.findPostfixs(domain_segments[lastIndex-1])) {
				if(domain_segments.length >= 3)
				{
				 domainReturn = domain_segments[lastIndex-2] + DOT2 +domain_segments[lastIndex-1] + DOT2 + domain_segments[lastIndex];
				}
				else 
				{
					domainReturn = domain_segments[lastIndex-1] + DOT2 + domain_segments[lastIndex];
				}
				
				return domainReturn;
			}
			//sina.cn
			domainReturn = domain_segments[lastIndex-1] + DOT2 + domain_segments[lastIndex];
			return domainReturn;
		}
		}
		return null;
	}

    public static boolean isSite(String url) {
        if(url == null || "".equals(url)) {
            return false;
        }
        if(url.endsWith("/")) {
            return false;
        }
        StringBuffer sb = new StringBuffer(url);
        boolean flag = true;
        if(org.apache.commons.lang.StringUtils.isNotEmpty(getTopDomain(url))) {
            if(sb.indexOf(PROTOCOL) >= 0)
            {
                sb.delete(0, sb.indexOf(PROTOCOL) + PROTOCOL.length());
            }
            if(url.endsWith(SLASH)) {
                sb.delete(sb.lastIndexOf(SLASH),sb.lastIndexOf(SLASH) + 1);
            }
            if(!sb.toString().trim().equalsIgnoreCase(getSite(url))) {
                if(sb.indexOf("/index") >= 0) {
                    sb.delete(sb.indexOf("/index"), sb.length());
                }
                if(sb.indexOf("/default") >= 0) {
                    sb.delete(sb.indexOf("/default"), sb.length());
                }
                if(sb.indexOf("/home") >= 0) {
                    sb.delete(sb.indexOf("/home"), sb.length());
                }
                flag = sb.toString().trim().equalsIgnoreCase(getSite(url));
            }
        } else {
            flag = org.apache.commons.lang.StringUtils.countMatches(url, "/") <= 1 && (url.indexOf("index") >= 0 ||
                        url.indexOf("default") >= 0 || url.indexOf("home") >= 0);
        }
        return flag;
        
    }


	/**
	 * 判断是否是ip地址
	 * @param url
	 * @return
	 */
	public static boolean isIp(String url)
	{
		 return IPPattern.matcher(url).matches();
	}



	
	//test method
	public static void main(String[] args){		
		String url = "http://www.sina.com/index.html/";
		System.out.println(isSite(url));
	}

}